package top.healthylife.gateway.platform.zd.api.utils;

import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
import top.healthylife.basics.utils.utils.RedisUtil;

import java.util.HashMap;
import java.util.concurrent.TimeUnit;

/**
 * @author : GaoZeXi
 * @date 2022/1/11 14:40
 */
@Data
@Accessors(chain = true)
@ApiModel("用户登录接口")
public class UserLoginUtil {

    /**
     * 登录地址
     */
    static final String LOGIN_URL = "https://{host}/LoginService/services/login";

    static final String TOKEN = "interface:api:zd:token";
    /**
     * 加密秘钥
     */
    static final String SM2_PUBLIC_KEY = "04593D186F5AB68871891C235A35ED90E6D5E8DC33414C89E05C29EBF5D19C3919F0D1956568619BA138AC724F4E5DC730266C8186F610D8CC85BFC0748F899695";

    static final SM2 sm2 = SmUtil.sm2(null, SM2_PUBLIC_KEY.getBytes());

    static HashMap<Integer,String>  errorLoginCode = new HashMap<>();

    static {
        errorLoginCode.put(100001,"用户名为空");
        errorLoginCode.put(100002,"密码为空");
        errorLoginCode.put(100003,"平台授权码为空");
        errorLoginCode.put(200004,"客户端IP获取失败");
        errorLoginCode.put(200005,"不存在该平台信息");
        errorLoginCode.put(200006,"该平台已经停用");
        errorLoginCode.put(200007,"当前登录人IP不属于该平台");
        errorLoginCode.put(300008,"当前登录人不存在");
        errorLoginCode.put(300009,"当前登录人所属管理员已经被停用");
        errorLoginCode.put(300010,"当前登录人所属管理员不存在");
        errorLoginCode.put(300011,"当前登录人所属管理员已被注销");
        errorLoginCode.put(300012,"当前登录人已经被停用");
        errorLoginCode.put(300013,"当前登录人没有接口查询权限");
        errorLoginCode.put(300014,"当前登录人所属的管理员没有接口查询权限");
    }


    /**
     * 第三方通过该接口获取使用登记接口所必需的登录令牌。每次调用登记接口前都必须有登录令牌,且登录令牌的有效期为30分钟。
     * 超过有效期使用登记接口时，必须重新登录。
     */
    public String login(String userName, String userPassword, String platformAuthCode) {
        byte[] userNameEnCrypt = sm2.encrypt(userName, KeyType.PublicKey);
        byte[] userPasswordEnCrypt = sm2.encrypt(userPassword, KeyType.PublicKey);
        byte[] platformAuthCodeEnCrypt = sm2.encrypt(platformAuthCode, KeyType.PublicKey);
        //HttpUtil.createPost(LOGIN_URL).
        //拿到登录token
        //存储到redis
        String token = "123";
        RedisUtil.set(TOKEN, token, 30, TimeUnit.MINUTES);
        return token;
    }

    /**
     * 是否已经登录
     *
     * @return true/false
     */
    public static boolean isLogin() {
        //token未失效,顺延30分钟
        if (RedisUtil.exists(TOKEN)) {
            RedisUtil.expire(TOKEN, 30, TimeUnit.MINUTES);
            return true;
        }
        return false;
    }
    //
    //public static void main(String[] args) {
    //    Set<Integer> integers = errorLoginCode.keySet();
    //    integers.removeIf(k->{
    //        if(k==10001){
    //            return true;
    //        }
    //        return false;
    //    });
    //    System.out.println("args = " + integers);
    //}

}
